package service;

import dao.AlunoTurmaDAO;
import dao.TurmaDAO;
import excecao.TurmaPossuiAlunosException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Aluno;
import modelo.AlunoTurma;
import modelo.Turma;
import util.FabricaDeObjetos;
import util.JPAUtil;

/**
 *
 * @author Abraao
 */
public class TurmaService {

    private static TurmaDAO turmaDAO;
    private static AlunoTurmaDAO alunoTurmaDAO;

    static {
        try {
            turmaDAO = (TurmaDAO) FabricaDeObjetos.getObjetoUnico(TurmaDAO.class);
            alunoTurmaDAO = (AlunoTurmaDAO) FabricaDeObjetos.getObjetoUnico(AlunoTurmaDAO.class);
        } catch (Exception ex) {
            Logger.getLogger(TurmaService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Turma> getTodas() {
        return turmaDAO.getAll();
    }

    public Turma getPorId(Long id) {
        return turmaDAO.getPorId(id);
    }
    
    public List<Turma> getPorNomeDisciplina(String nomeDisciplina) {
        return turmaDAO.getPorNomeDisciplina(nomeDisciplina);
    }

    public void inserir(Turma turma) {
        JPAUtil.beginTransaction();
        turmaDAO.persist(turma);
        JPAUtil.commitTransaction();
    }

    public void remover(Turma turma) throws TurmaPossuiAlunosException {
        JPAUtil.beginTransaction();
        Turma turma1 = turmaDAO.getPorId(turma.getId());
        
        List<AlunoTurma> listaAlunoTurma = alunoTurmaDAO.getPorTurma(turma1);

        if (listaAlunoTurma != null && !listaAlunoTurma.isEmpty()) {
            throw new TurmaPossuiAlunosException("A turma possui alunos cadastrados!");
        }
        turmaDAO.remove(turma1);

        JPAUtil.commitTransaction();
    }

    public void alterar(Turma turmaMod) throws TurmaPossuiAlunosException {
        JPAUtil.beginTransaction();
        List<AlunoTurma> listaAlunoTurma = alunoTurmaDAO.getPorTurma(turmaMod);

        if (listaAlunoTurma != null && !listaAlunoTurma.isEmpty()) {
            throw new TurmaPossuiAlunosException("A turma possui alunos cadastrados!");
        }
        turmaDAO.merge(turmaMod);

        JPAUtil.commitTransaction();
    }

    public List<Turma> getDisponiveisPorAluno(Aluno alunoCorrente) {
        return turmaDAO.getDisponiveisPorAluno(alunoCorrente);
    }

    public Turma getPorIdComAlunos(Long id) {
        return turmaDAO.getPorIdComListaAlunoTurmas(id);
    }

    public void setAlteracao(Turma turmaMod) {
        JPAUtil.beginTransaction();

        turmaDAO.merge(turmaMod);

        JPAUtil.commitTransaction();
    }

    public Turma getPorIdComListaAlunoTurmas(Long id) {
        return turmaDAO.getPorIdComListaAlunoTurmas(id);
    }
}
